"""
提示词管理器 - 统一管理所有提示词模板
"""
import os
from typing import Dict, Optional
import aiofiles


class PromptManager:
    """提示词管理器"""
    
    def __init__(self, prompts_dir: str = None):
        if prompts_dir is None:
            current_dir = os.path.dirname(os.path.abspath(__file__))
            prompts_dir = os.path.join(current_dir, "templates")
        
        self.prompts_dir = prompts_dir
        self._cache: Dict[str, str] = {}
        self._ensure_prompts_dir()

    def _ensure_prompts_dir(self):
        """确保提示词目录存在"""
        if not os.path.exists(self.prompts_dir):
            os.makedirs(self.prompts_dir, exist_ok=True)

    async def get_prompt(self, prompt_name: str, **kwargs) -> str:
        """获取提示词模板并进行变量替换"""
        if prompt_name not in self._cache:
            await self._load_prompt(prompt_name)
        
        prompt_template = self._cache.get(prompt_name, "")
        
        # 进行变量替换
        if kwargs:
            try:
                return prompt_template.format(**kwargs)
            except KeyError as e:
                print(f"提示词模板 {prompt_name} 中缺少变量: {e}")
                return prompt_template
        
        return prompt_template

    async def _load_prompt(self, prompt_name: str):
        """从文件加载提示词"""
        file_path = os.path.join(self.prompts_dir, f"{prompt_name}.txt")
        
        if os.path.exists(file_path):
            try:
                async with aiofiles.open(file_path, 'r', encoding='utf-8') as f:
                    content = await f.read()
                    self._cache[prompt_name] = content.strip()
            except Exception as e:
                print(f"加载提示词文件 {file_path} 失败: {e}")
                self._cache[prompt_name] = f"提示词 {prompt_name} 加载失败"
        else:
            print(f"提示词文件 {file_path} 不存在")
            self._cache[prompt_name] = f"提示词 {prompt_name} 不存在"

    def clear_cache(self):
        """清除缓存"""
        self._cache.clear()

    async def reload_prompt(self, prompt_name: str):
        """重新加载指定提示词"""
        if prompt_name in self._cache:
            del self._cache[prompt_name]
        await self._load_prompt(prompt_name)

    def list_cached_prompts(self) -> list:
        """列出已缓存的提示词"""
        return list(self._cache.keys())